<?php

// 注册自加载
spl_autoload_register('autoload');

function autoload($class)
{
    require dirname(__FILE__) . '/' . str_replace('\\', '/', $class) . '.php';
}


// use StaticFactory\Test;


/**
 * 静态工厂模式
 * @var StaticFactory
 */
$test = new StaticFactory\Test;
$test->index();

echo '<hr>';
/********************************************************************************/
/**
 * 单例模式
 * @var [type]
 */
use Singleton\Singleton;

$instance = Singleton::getInstance();
$instance->test();

//clone对象
$cloneInstance = clone $instance;

echo '<hr>';
/********************************************************************************/
/**
 * 工厂模式
 */
use Factory\Farm;
use Factory\Zoo;
use Factory\SampleFactory;

//初始化一个农场
$farm = new Farm();
//生产一只鸡
$farm->produce('chicken')->run();
//生产一只猪
$farm->produce('pig')->run();

//初始化一个动物园工厂
$zoo = new Zoo();
$zoo->produce('chicken')->run();
$zoo->produce('pig')->run();


//简单工厂模式
SampleFactory::produce('chicken')->run();
SampleFactory::produce('pig')->run();

echo '<hr>';
/********************************************************************************/
/**
 * 创建型模式
 *
 * php建造者模式
 * 简单对象构建复杂对象
 * 基本组件不变，但是组件之间的组合方式善变
 *
 * 下面我们来构建手机和mp3
 *
 * // 手机简单由以下构成
 * 手机 => 名称，硬件， 软件
 * // 硬件又由以下硬件构成
 * 硬件 => 屏幕，cpu, 内存， 储存， 摄像头
 * // 软件又由以下构成
 * 软件 => android, ubuntu
 *
 * * // mp3简单由以下构成
 * 手机 => 名称，硬件， 软件
 * // 硬件又由以下硬件构成
 * 硬件 => cpu, 内存， 储存
 * // 软件又由以下构成
 * 软件 => mp3 os
 *
 */
use Builder\Mp3Builder;
use Builder\Director;

$builder = new Mp3Builder('荣耀9', [
    'cpu' => 4,
    'ram' => 1,
    'storage' => 128
],['os' => 'mp3 os']);

$builder->getResult();
echo '<hr>';

$director = new Director();
$director->setBuilder($builder);
$director->getResult();

echo '<hr>';

/********************************************************************************/
